import os

import fitz  # PyMuPDF
from PIL import Image


def pdf_to_long_image(pdf_path, output_path, zoom=3):
    """
    将PDF转换为单张长图
    :param pdf_path: PDF文件路径
    :param output_path: 输出图片路径
    :param zoom: 缩放因子，提高分辨率
    """
    # 打开PDF文件
    pdf = fitz.open(pdf_path)
    images = []
    total_height = 0
    max_width = 0

    # 遍历每一页并转换为图像
    for page_num in range(len(pdf)):
        page = pdf.load_page(page_num)
        # 设置缩放矩阵提升分辨率
        mat = fitz.Matrix(zoom, zoom)
        pix = page.get_pixmap(matrix=mat)
        pil_img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
        images.append(pil_img)

        # 更新最大宽度和总高度
        max_width = max(max_width, pil_img.width)
        total_height += pil_img.height

    # 创建空白长图（白色背景）
    long_img = Image.new("RGB", (max_width, total_height), (255, 255, 255))
    y_offset = 0

    # 拼接所有图片
    for img in images:
        # 居中放置每页图片
        x_offset = (max_width - img.width) // 2
        long_img.paste(img, (x_offset, y_offset))
        y_offset += img.height

    # 保存结果
    long_img.save(output_path, "PNG", quality=100)
    print(f"转换成功！图片保存至: {os.path.abspath(output_path)}")


# 使用示例
pdf_to_long_image("E:/!找工作/唐志强-数仓工程师-v20251014.pdf",
                  "E:/!找工作/唐志强-数仓工程师-v20251014.png", zoom=4)
